package com.knowledge.plus.泛型.demo;

import lombok.Data;

/**
 * 编写一个方法，该方法接受一个 PairIncrease<? super Integer> 类型的参数，并将该对中的两个值都增加 10
 *
 * @author TPF
 * @since 2024/9/6
 */
@Data
public class PairIncrease<T> {

    private T value1;
    private T value2;

    public PairIncrease(T value1, T value2) {
        this.value1 = value1;
        this.value2 = value2;
    }

    /**
     * 下界通配符：可以写 不能读
     * <? super Integer> 是 Java 泛型中的一个限定符，表示一个未知的上界类型
     * - ? 表示一个未知的类型（通配符）
     * - ? super Integer 表示该未知类型可以接受 Integer 及其父类型 Number 和 Object
     */
    public void increasePairValues(PairIncrease<? super Integer> pair) {
        // 由于 Integer 类实现了 Number 接口，因此可以进行强制类型转换并执行加法操作
        Integer value11 = (Integer) pair.value1;
        Integer value21 = (Integer) pair.value2;
        pair.setValue1(value11 + 10);
        pair.setValue2(value21 + 10);
    }

    /**
     * 上界通配符：可以读 不能写
     * <? extends Number> 限制了传入参数只能是 Number 或其子类（如 Integer, Double 等）
     */
    public void increaseValue(PairIncrease<? extends Number> pair) {
        Integer value11 = (Integer) pair.getValue1();
        Integer value21 = (Integer) pair.getValue2();
        // 当尝试将 Integer 转换为 Number 的子类型并执行加法操作时，编译器无法确定具体子类型（如 int）
        // pair.setValue1(value11 + 10);    // 报错
        // pair.setValue2(value21 + 10);    // 报错
    }

    public static void main(String[] args) {
        PairIncrease<Integer> increase = new PairIncrease<>(6, 8);
        increase.increasePairValues(increase);
        System.out.println("增加后的值：value1 = " + increase.value1 + "，value2 = " + increase.value2);
    }

}
